#include "./key.h"
#include "../device/device.h"
#include "../rtx/rtx_os.h"

namespace driver {

utils::Object<Key_t> key;

/**
 * @brief Construct a new Key_t::Key_t object
 * Key0 PA29
 * Key1 PA30
 * Key2 PA31
 * 旋钮 PB7
 */

Key_t::Key_t() {
    GPIO_InitStruType gpio;

    gpio.GPIO_Signal = GPIO_Pin_Signal_Digital;
    gpio.GPIO_Func = GPIO_Func_0;
    gpio.GPIO_Direction = GPIO_Dir_In;
    gpio.GPIO_PUEN = GPIO_PUE_Input_Disable;
    gpio.GPIO_PDEN = GPIO_PDE_Input_Disable;
    gpio.GPIO_OD = GPIO_ODE_Output_Disable;
    gpio.GPIO_DS = GPIO_DS_Output_Strong;
    GPIO_Init(GPIOA, GPIO_Pin_29, &gpio);
    GPIO_Init(GPIOA, GPIO_Pin_30, &gpio);
    GPIO_Init(GPIOA, GPIO_Pin_31, &gpio);
    GPIO_Init(GPIOB, GPIO_Pin_7, &gpio);

    gpio.GPIO_Direction = GPIO_Dir_Out;
    GPIO_Init(GPIOB, GPIO_Pin_9, &gpio);

    ctrl_led(true);
}

void Key_t::ctrl_led(bool flag) {
    if (flag) {
        GPIOB_SetBit(GPIO_Pin_9);
    } else {
        GPIOB_ResetBit(GPIO_Pin_9);
    }
}

bool Key_t::wait_knob() {
    if (!wait_knob(false)) {
        return false;
    }
    if (!wait_knob(true)) {
        return false;
    }
    if (!wait_knob(false)) {
        return false;
    }
    return true;
}

bool Key_t::wait_knob(bool flag) {
    uint32_t time_count = 0;
    for (;;) {
        if (is_knob() == flag) {
            return true;
        }
        osDelay(10);
        time_count += 10;
        if (time_count >= Timeout) {
            break;
        }
    }
    return false;
}

bool Key_t::is_key0() {
    return GPIO_ReadBit(GPIOA, GPIO_Pin_29) == RESET;
}

bool Key_t::is_key1() {
    return GPIO_ReadBit(GPIOA, GPIO_Pin_30) == RESET;
}

bool Key_t::is_key2() {
    return GPIO_ReadBit(GPIOA, GPIO_Pin_31) == RESET;
}

bool Key_t::is_knob() {
    return GPIO_ReadBit(GPIOB, GPIO_Pin_7) == RESET;
}

}
